package com.ruoyi.domain;

import com.alibaba.fastjson2.annotation.JSONField;
import com.ruoyi.common.core.domain.BaseEntity;
import lombok.Data;

import java.util.Date;

/**
 * EMQX客户端连接信息实体类
 * 用于存储和表示EMQX消息代理中客户端的连接状态和统计信息
 */
@Data
public class DeviceEmqxClient extends BaseEntity {
    private static final long serialVersionUID = 1L;

    // 基础连接信息
    /**
     * 客户端ID，MQTT连接时客户端提供的唯一标识符
     */
    private String clientid;
    /**
     * 客户端连接时使用的用户名，用于认证
     */
    private String username;
    /**
     * 客户端的IP地址
     */
    @JSONField(name = "ip_address")
    private String ipAddress;
    /**
     * 客户端连接的端口号
     */
    private int port;
    /**
     * 客户端当前连接状态：true表示已连接，false表示已断开
     */
    private boolean connected;
    /**
     * 客户端连接时间，格式为ISO 8601
     */
    @JSONField(name = "connected_at")
    private Date connectedAt;
    /**
     * 客户端创建时间，格式为ISO 8601
     */
    @JSONField(name = "created_at")
    private Date createdAt;
    /**
     * 客户端设置的Keepalive间隔（秒），用于检测连接状态
     */
    private int keepalive;
    /**
     * MQTT协议版本号：3表示MQTT 3.1，4表示MQTT 3.1.1，5表示MQTT 5.0
     */
    @JSONField(name = "proto_ver")
    private int protoVer;
    /**
     * MQTT协议名称，通常为"MQTT"
     */
    @JSONField(name = "proto_name")
    private String protoName;
    /**
     * EMQ X节点名称，客户端当前连接的节点
     */
    private String node;
    /**
     * 客户端连接的监听器类型，如"tcp:default"或"ws:default"
     */
    private String listener;
    /**
     * 清洁会话标志：true表示断开时清除会话状态，false表示保留会话
     */
    @JSONField(name = "clean_start")
    private boolean cleanStart;
    /**
     * 是否为持久化会话：true表示持久化，false表示非持久化
     */
    @JSONField(name = "is_persistent")
    private boolean isPersistent;
    /**
     * 是否为桥接客户端：true表示是MQTT桥接连接，false表示普通客户端
     */
    @JSONField(name = "is_bridge")
    private boolean isBridge;
    /**
     * 是否启用认证：true表示启用了认证机制，false表示未启用
     */
    @JSONField(name = "enable_authn")
    private boolean enableAuthn;
    /**
     * 客户端挂载点，用于主题前缀
     */
    private String mountpoint;

    // 消息统计信息
    /**
     * 接收的消息总数
     */
    @JSONField(name = "recv_msg")
    private long recvMsg;
    /**
     * 发送的消息总数
     */
    @JSONField(name = "send_msg")
    private long sendMsg;
    /**
     * 接收的总字节数
     */
    @JSONField(name = "recv_oct")
    private long recvOct;
    /**
     * 发送的总字节数
     */
    @JSONField(name = "send_oct")
    private long sendOct;
    /**
     * 接收的数据包总数
     */
    @JSONField(name = "recv_pkt")
    private long recvPkt;
    /**
     * 发送的数据包总数
     */
    @JSONField(name = "send_pkt")
    private long sendPkt;
    /**
     * 接收操作的计数
     */
    @JSONField(name = "recv_cnt")
    private long recvCnt;
    /**
     * 发送操作的计数
     */
    @JSONField(name = "send_cnt")
    private long sendCnt;

    // QoS级别消息统计
    /**
     * 接收的QoS 0级别消息数
     */
    @JSONField(name = "recv_msg.qos0")
    private long recvMsgQos0;
    /**
     * 接收的QoS 1级别消息数
     */
    @JSONField(name = "recv_msg.qos1")
    private long recvMsgQos1;
    /**
     * 接收的QoS 2级别消息数
     */
    @JSONField(name = "recv_msg.qos2")
    private long recvMsgQos2;
    /**
     * 发送的QoS 0级别消息数
     */
    @JSONField(name = "send_msg.qos0")
    private long sendMsgQos0;
    /**
     * 发送的QoS 1级别消息数
     */
    @JSONField(name = "send_msg.qos1")
    private long sendMsgQos1;
    /**
     * 发送的QoS 2级别消息数
     */
    @JSONField(name = "send_msg.qos2")
    private long sendMsgQos2;

    // 队列与内存状态
    /**
     * 消息队列当前长度
     */
    @JSONField(name = "mqueue_len")
    private long mqueueLen;
    /**
     * 消息队列最大长度限制
     */
    @JSONField(name = "mqueue_max")
    private long mqueueMax;
    /**
     * 消息队列中被丢弃的消息总数
     */
    @JSONField(name = "mqueue_dropped")
    private long mqueueDropped;
    /**
     * 进程堆内存使用大小（字节）
     */
    @JSONField(name = "heap_size")
    private long heapSize;
    /**
     * 进程执行的 reductions 计数器（Erlang VM概念，用于衡量CPU使用）
     */
    @JSONField(name = "reductions")
    private long reductions;
    /**
     * 邮箱长度，即等待处理的消息数量
     */
    @JSONField(name = "mailbox_len")
    private long mailboxLen;
    /**
     * 当前飞行中的消息数量（已发送但未确认）
     */
    @JSONField(name = "inflight_cnt")
    private long inflightCnt;
    /**
     * 飞行中消息的最大数量限制
     */
    @JSONField(name = "inflight_max")
    private long inflightMax;
    /**
     * 等待REL包的消息数量（QoS 2流程中）
     */
    @JSONField(name = "awaiting_rel_cnt")
    private long awaitingRelCnt;
    /**
     * 等待REL包的最大消息数量限制
     */
    @JSONField(name = "awaiting_rel_max")
    private long awaitingRelMax;
    /**
     * 客户端当前订阅的主题数量
     */
    @JSONField(name = "subscriptions_cnt")
    private long subscriptionsCnt;
    /**
     * 客户端允许的最大订阅数量，"infinity"表示无限制
     */
    @JSONField(name = "subscriptions_max")
    private String subscriptionsMax;
    /**
     * 会话过期时间间隔（秒），0表示不过期
     */
    @JSONField(name = "expiry_interval")
    private long expiryInterval;

    // 丢弃消息统计
    /**
     * 接收消息中被丢弃的总数
     */
    @JSONField(name = "recv_msg.dropped")
    private long recvMsgDropped;
    /**
     * 发送消息中被丢弃的总数
     */
    @JSONField(name = "send_msg.dropped")
    private long sendMsgDropped;
    /**
     * 因等待PUBREL超时被丢弃的接收消息数
     */
    @JSONField(name = "recv_msg.dropped.await_pubrel_timeout")
    private long recvMsgDroppedAwaitPubrelTimeout;
    /**
     * 因过期被丢弃的发送消息数
     */
    @JSONField(name = "send_msg.dropped.expired")
    private long sendMsgDroppedExpired;
    /**
     * 因队列满被丢弃的发送消息数
     */
    @JSONField(name = "send_msg.dropped.queue_full")
    private long sendMsgDroppedQueueFull;
    /**
     * 因消息太大被丢弃的发送消息数
     */
    @JSONField(name = "send_msg.dropped.too_large")
    private long sendMsgDroppedTooLarge;

}
